#include "CasilleroIDA.h"
#include <stdlib.h>
#include "Excepcion.h"
#include <stdio.h>


//Revisado.

CasilleroIDA::CasilleroIDA(const int *info, int dimenciones, short posicionDeVacio) : Casillero(dimenciones, posicionDeVacio) {
    int length;

    if (info == NULL)
        throw new Excepcion("info no debe ser NULL en \"Casillero::Casillero(int *info, int dimenciones)\".");

    this->dimenciones = dimenciones;
    this->posVacio = posicionDeVacio;

    if (info[posVacio] != 0)
        throw new Excepcion("Arreglo info no contiene cero en posicion de vacio en \"Casillero::Casillero(int *info, int dimenciones)\".");



    this->info = (int *) malloc(dimenciones * dimenciones * sizeof (int));

    { //Copiando el arreglo de informacion:
        int *dest = this->info;
        for (length = dimenciones * dimenciones - 1; length + 1; length--)
            *dest++ = *info++;
    }
}

CasilleroIDA::~CasilleroIDA() {
    free(info);
}

//Revisado.

char CasilleroIDA::Info(int i) const {
    return (char)info[i];
}

//Revisado.

short CasilleroIDA::Dimenciones() const {
    return dimenciones;
}

//Revisado.

short CasilleroIDA::Vacio() const {
    return posVacio;
}

//Revisado.

void CasilleroIDA::moverCero(int pos) {
    if (pos >= dimenciones * dimenciones || pos < 0)
        throw new Excepcion("parametro pos fuera de los limites en \"void Casillero::moverCero(int pos)\"");

    info[posVacio] = info[pos];
    info[pos] = 0;
    posVacio = pos;
}

//Revisado.

Casillero* CasilleroIDA::Clone() const {
    return new CasilleroIDA(info, dimenciones, posVacio);
}

//Revisado.

void CasilleroIDA::toString(char *out) const {
    int i, j, k = 0;
    char *ini = out;
    for (i = 0; i < dimenciones; i++) {
        for (j = 0; j < dimenciones; j++) {
            if (info[k] < 10) sprintf(out++, " ");

            sprintf(out++, "%d", info[k++]);
            if (info[k - 1] >= 10) out++;

            if (j < dimenciones - 1) {
                sprintf(out, ", ");
                out += 2;
            }
        }
        if (i < dimenciones - 1) sprintf(out++, "\n");
    }
}

//Revisado.

char* CasilleroIDA::toString() const {
    int size = (4 * dimenciones * dimenciones - dimenciones + 1);

    char * r = (char *) malloc((size + 1) * sizeof (char));
    toString(r);
    r[size] = '\0';
    return r;
}


